home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 002 / scann.arc / SCAN.C next >
C/C++ Source or Header  |  1986-01-09  |  5KB  |  191 lines

  1. /****************************************************************************/
  2. /*  SCAN                                        C source syntax checker     */
  3. /****************************************************************************/
  4.  
  5.  
  6. #include "stdio.h"
  7. #include "direct.h"
  8. #define MAXL 301
  9.  
  10. int noc = 0;
  11. int ncc = 0;
  12. char *fgets();
  13. char *strncpy();
  14. char *strchr();
  15. int nq=0;
  16. int ndq=0;
  17. int nb=0;
  18. int nc=0;
  19. int no=0;
  20.  
  21. main(argc,argv)
  22.  
  23. int argc;
  24. char *argv[];
  25.  
  26. {
  27. char fspec[67];
  28. char s[MAXL];
  29. int lno = 0;
  30. int yr;
  31. int mo;
  32. int dy;
  33. int hr;
  34. int mi;
  35. int hrs,mins,secs,tics;
  36. int cur_m;
  37. int cur_d;
  38. int cur_y;
  39. FILE *infile;
  40. FSPEC file_spec;
  41.  
  42. printf("SCAN                                                    C source syntax checker\n");
  43. printf("-------------------------------------------------------------------------------\n");
  44.  
  45. if(argc > 2)
  46.     {
  47.     printf("\nInvalid parameter\n");
  48.     printf("Syntax: SCAN [d:]filename\n");
  49.     printf("        SCAN     (for help)\n");
  50.     exit(0);
  51.     }
  52.  
  53. if(argc < 2)
  54.     {
  55.     help();
  56.     exit(0);
  57.     }
  58.  
  59. strcpy(fspec,argv[1]);
  60.  
  61. infile = fopen(fspec,"r");
  62. if(infile == NULL)
  63.     {
  64.     printf("\nFile not found\n");
  65.     printf("Syntax: SCAN [d:]filename\n");
  66.     printf("        SCAN     (for help)\n");
  67.     exit(0);
  68.     }
  69.  
  70. drsfirst(fspec,23,&file_spec);      /*read first directory entry for info*/
  71.     yr = ((file_spec.fdate >> 9) & 0x7f) + 80;
  72.     if(yr >= 100)
  73.         yr = yr-100;
  74.     mo = (file_spec.fdate >> 5) & 0x0f;
  75.     dy = file_spec.fdate & 0x1f;
  76.     hr = (file_spec.ftime >> 11) & 0x3f;
  77.     if(hr > 12)
  78.         hr = hr-12;
  79.     mi = (file_spec.ftime >> 5) & 0x3f;
  80.  
  81. qyretdat(&cur_y,&cur_m,&cur_d);      /* return system date                    */
  82. qyrettim(&hrs,&mins,&secs,&tics);       /* return system time                 */
  83.     if(hrs > 12)
  84.         hrs = hrs-12;
  85.  
  86. cur_y = cur_y-1900;
  87.  
  88. printf("%-12s  %7ld  %2d/%02d/%02d  %2d:%02d                 Runtime: %2d:%02d  %2d/%02d/%d\n",file_spec.fname,file_spec.fsize,mo,dy,yr,hr,mi,hrs,mins,cur_m,cur_d,cur_y);
  89. printf("-------------------------------------------------------------------------------\n\n");
  90.  
  91.  
  92.  
  93. while(fgets(s,MAXL-1,infile) != NULL)
  94.     {
  95.     lno++;
  96.     if(scan_line(s) || (noc != ncc))
  97.         {
  98.         printf("%5d %s",lno,s);
  99.         if(strchr(s,'\n') == NULL)
  100.             putchar('\n');
  101.         }
  102.     }
  103. printf("\nBraces =%4d     Single quotes =%4d     Double quotes =%4d\n",nb,nq,ndq);
  104. printf("Comment opens =%4d     Comment closes =%4d\n\n",no,nc);
  105.  
  106.  
  107. }
  108.  
  109.  
  110. /*--------------------------------------------------------------------------*/
  111. /* scan_line                                                                */
  112. /*--------------------------------------------------------------------------*/
  113.  
  114. int scan_line(ps)
  115.  
  116. char *ps;
  117. {
  118.  
  119. int last_char;
  120. int nquote;
  121. int ndquote;
  122. int nbrace;
  123.  
  124. last_char = -1;
  125. nbrace = nquote = ndquote = 0;
  126.  
  127. while(*ps != '\0')
  128.     {
  129.     switch(*ps)
  130.         {
  131.         case '/': if(last_char == '*')
  132.                     {
  133.                     ncc++;
  134.                     nc++;
  135.                     }
  136.                     break;
  137.  
  138.         case '*': if(last_char == '/')
  139.                     {
  140.                     noc++;
  141.                     no++;
  142.                     }
  143.                     break;
  144.  
  145.         case '\'': nquote++;
  146.                    nq++;
  147.                    break;
  148.  
  149.         case '\"': ndquote++;
  150.                    ndq++;
  151.                    break;
  152.  
  153.         case '{':
  154.         case '}': nbrace++;
  155.                   nb++;
  156.                   break;
  157.         }
  158.  
  159.     last_char = *ps;
  160.     ps++;
  161.     }
  162.  
  163. if((nbrace > 0) || ((nquote % 2) != 0) || ((ndquote % 2) != 0))
  164.     return(1);
  165. else
  166.     return(0);
  167.  
  168. }
  169.  
  170. /*--------------------------------------------------------------------------*/
  171. /*  help                                                                    */
  172. /*--------------------------------------------------------------------------*/
  173.  
  174. help()
  175. {
  176. printf("\nSyntax: SCAN [d:]filename\n\n");
  177. printf("SCAN counts braces, single quotes, double quotes, and opening and closing\n");
  178. printf("comment marks.  It prints a line if it has a brace in the line.  If an opening\n");
  179. printf("comment mark is alone on a line, that line and every line until a closing mark\n");
  180. printf("is found is printed.  Any line that has an odd number of quote marks is also\n");
  181. printf("printed.\n\n");
  182.  
  183. printf("A total count of opening and closing comment marks, single quotes, double \n");
  184. printf("quotes, and braces is displayed at the end of the listing.  Counts for quotes\n");
  185. printf("and braces should be even numbers.  Opening comment marks should equal closing\n");
  186. printf("comment marks.\n\n");
  187.  
  188. printf("SCAN doesn't really find errors, it just reduces the number of lines\n");
  189. printf("which you check.\n\n\n");
  190. }
  191.